package handler

import (
	"admin-nexus-backend/internal/dto"
	"admin-nexus-backend/internal/service"
	"admin-nexus-backend/pkg/response"

	"github.com/gin-gonic/gin"
)

type ResourceHandler struct {
	resourceService *service.ResourceService
}

func NewResourceHandler(resourceService *service.ResourceService) *ResourceHandler {
	return &ResourceHandler{
		resourceService: resourceService,
	}
}

// GetResourceList 获取资源列表
// @Summary 获取资源列表
// @Description 获取资源列表（不分页）
// @Tags 资源管理
// @Security ApiKeyAuth
// @Produce json
// @Param name query string false "资源名称"
// @Param code query string false "权限编码"
// @Param type query int false "类型"
// @Param status query int false "状态"
// @Success 200 {object} response.Response{data=[]model.Resource}
// @Router /api/v1/resources [get]
func (h *ResourceHandler) GetResourceList(c *gin.Context) {
	var params dto.ResourceQueryParams
	if err := c.ShouldBindQuery(&params); err != nil {
		response.Error(c, "参数错误")
		return
	}

	resources, err := h.resourceService.GetResourceList(&params)
	if err != nil {
		response.Error(c, "获取资源列表失败")
		return
	}

	response.SuccessWithData(c, resources)
}

// GetResourceTree 获取资源树
// @Summary 获取资源树
// @Description 获取树形结构的资源列表
// @Tags 资源管理
// @Security ApiKeyAuth
// @Produce json
// @Param name query string false "资源名称"
// @Param code query string false "权限编码"
// @Param type query int false "类型"
// @Param status query int false "状态"
// @Success 200 {object} response.Response{data=[]model.Resource}
// @Router /api/v1/resources/tree [get]
func (h *ResourceHandler) GetResourceTree(c *gin.Context) {
	var params dto.ResourceQueryParams
	if err := c.ShouldBindQuery(&params); err != nil {
		response.Error(c, "参数错误")
		return
	}

	tree, err := h.resourceService.GetResourceTree(&params)
	if err != nil {
		response.Error(c, "获取资源树失败")
		return
	}

	response.SuccessWithData(c, tree)
}

// GetResourceByID 获取资源详情
// @Summary 获取资源详情
// @Description 根据资源ID获取资源详情
// @Tags 资源管理
// @Security ApiKeyAuth
// @Produce json
// @Param id path int true "资源ID"
// @Success 200 {object} response.Response{data=model.Resource}
// @Router /api/v1/resources/{id} [get]
func (h *ResourceHandler) GetResourceByID(c *gin.Context) {
	var req dto.IDRequest
	if err := c.ShouldBindUri(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	resource, err := h.resourceService.GetResourceByID(req.ID)
	if err != nil {
		response.Error(c, "获取资源信息失败")
		return
	}

	response.SuccessWithData(c, resource)
}

// CreateResource 创建资源
// @Summary 创建资源
// @Description 创建新资源
// @Tags 资源管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param req body dto.ResourceCreateRequest true "资源信息"
// @Success 200 {object} response.Response
// @Router /api/v1/resources [post]
func (h *ResourceHandler) CreateResource(c *gin.Context) {
	var req dto.ResourceCreateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.resourceService.CreateResource(&req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// UpdateResource 更新资源
// @Summary 更新资源
// @Description 更新资源信息
// @Tags 资源管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param id path int true "资源ID"
// @Param req body dto.ResourceUpdateRequest true "资源信息"
// @Success 200 {object} response.Response
// @Router /api/v1/resources/{id} [put]
func (h *ResourceHandler) UpdateResource(c *gin.Context) {
	var uriReq dto.IDRequest
	if err := c.ShouldBindUri(&uriReq); err != nil {
		response.Error(c, "参数错误")
		return
	}

	var req dto.ResourceUpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.resourceService.UpdateResource(uriReq.ID, &req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// DeleteResource 删除资源
// @Summary 删除资源
// @Description 删除资源
// @Tags 资源管理
// @Security ApiKeyAuth
// @Produce json
// @Param id path int true "资源ID"
// @Success 200 {object} response.Response
// @Router /api/v1/resources/{id} [delete]
func (h *ResourceHandler) DeleteResource(c *gin.Context) {
	var req dto.IDRequest
	if err := c.ShouldBindUri(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.resourceService.DeleteResource(req.ID); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// BatchDeleteResource 批量删除资源
// @Summary 批量删除资源
// @Description 批量删除多个资源
// @Tags 资源管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param ids body []uint true "资源ID列表"
// @Success 200 {object} response.Response
// @Router /api/v1/resources/batch [delete]
func (h *ResourceHandler) BatchDeleteResource(c *gin.Context) {
	var req []uint
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.resourceService.BatchDeleteResource(req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}
